{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.random.uniform(-3, 3, size=100)\n",
    "X = x. reshape(-1, 1)\n",
    "y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "poly = PolynomialFeatures(degree=2)\n",
    "poly.fit(X)\n",
    "X2 = poly.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 3)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.        , -1.34284888,  1.80324311],\n",
       "       [ 1.        , -0.18985858,  0.03604628],\n",
       "       [ 1.        , -1.58563134,  2.51422675],\n",
       "       [ 1.        ,  1.2149354 ,  1.47606802],\n",
       "       [ 1.        , -2.05874706,  4.23843944]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X2[:5,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.34284888],\n",
       "       [-0.18985858],\n",
       "       [-1.58563134],\n",
       "       [ 1.2149354 ],\n",
       "       [-2.05874706]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X[:5,:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一列是1，第二列是原数据，第三列是原数据的平方"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "lin_reg2 = LinearRegression()\n",
    "lin_reg2.fit(X2, y)\n",
    "y_predict2 = lin_reg2.predict(X2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.plot(np.sort(x), y_predict2[np.argsort(x)], color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 1.01723515, 0.46407147])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lin_reg2.coef_   #0是对X2是第一列数据拟合的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.1789150996943945"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lin_reg2.intercept_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关于PolynomialFeatures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 2)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.arange(1,11).reshape(-1, 2)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  2],\n",
       "       [ 3,  4],\n",
       "       [ 5,  6],\n",
       "       [ 7,  8],\n",
       "       [ 9, 10]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 6)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly = PolynomialFeatures(degree=2)\n",
    "poly.fit(X)\n",
    "X2 = poly.transform(X)\n",
    "X2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1.,   1.,   2.,   1.,   2.,   4.],\n",
       "       [  1.,   3.,   4.,   9.,  12.,  16.],\n",
       "       [  1.,   5.,   6.,  25.,  30.,  36.],\n",
       "       [  1.,   7.,   8.,  49.,  56.,  64.],\n",
       "       [  1.,   9.,  10.,  81.,  90., 100.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一列：1，即0次幂\n",
    "第二列：x1，1次幂\n",
    "第三列：x2，1次幂\n",
    "第四列：x1^2，2次幂\n",
    "第五列：x1*x2，2次幂\n",
    "第六列：x2^2，2次幂"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 10)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly = PolynomialFeatures(degree=3)\n",
    "poly.fit(X)\n",
    "X3 = poly.transform(X)\n",
    "X3.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   1.,    1.,    2.,    1.,    2.,    4.,    1.,    2.,    4.,\n",
       "           8.],\n",
       "       [   1.,    3.,    4.,    9.,   12.,   16.,   27.,   36.,   48.,\n",
       "          64.],\n",
       "       [   1.,    5.,    6.,   25.,   30.,   36.,  125.,  150.,  180.,\n",
       "         216.],\n",
       "       [   1.,    7.,    8.,   49.,   56.,   64.,  343.,  392.,  448.,\n",
       "         512.],\n",
       "       [   1.,    9.,   10.,   81.,   90.,  100.,  729.,  810.,  900.,\n",
       "        1000.]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "把多项式特征、数据规一化、线性回归三步合在一起，使得不需要在每一次调用时都重复这三步"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.random.uniform(-3, 3, size=100)\n",
    "X = x. reshape(-1, 1)\n",
    "y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "poly_reg = Pipeline([\n",
    "    (\"poly\", PolynomialFeatures(degree=2)),\n",
    "    (\"std_scaler\", StandardScaler()),\n",
    "    (\"lin_reg\", LinearRegression())\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "poly_reg.fit(X, y)\n",
    "y_predict = poly_reg.predict(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "sklearn没有直接提供多项式回归算法，但可以使用pipe很方便地创建一个多项式回归算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
